package miniprojet;

import java.util.Iterator;
import java.util.List;

/**
 * Le client d'administration des données. Cette classe permet de consulter les
 * données du serveur, de saisir les caractéristiques d'un moyen de transport
 * pour l'ajouter aux données du serveur, ou de modifier des caractéristiques
 * d'un moyen de transport dans les données du serveur.
 * 
 * @author Alexis Laurent & Antoine Lavail
 * @version 2011.11.21
 */

public class Admin {

    // Référence au serveur
    private Serveur s;

    /**
     * Constructeur de la classe Admin.
     * 
     * @param serveur
     *            : le serveur contenant la liste de transports.
     */
    public Admin(Serveur serveur) {
        this.s = serveur;
    }

    /**
     * Méthode permettant à l'administrateur de consulter toutes les données que
     * contient le serveur.
     * 
     * @return une string contenant tous les transports disponibles dans la base
     *         de données ainsi que tous les trajets associés, ainsi que les
     *         voyageurs.
     */
    public String showTransports() {
        List<Transport> listT = s.getTransports();
        String s = new String();
        Iterator<Transport> it = listT.iterator();
        while (it.hasNext()) {
            Transport t = it.next();
            s += "TYPE DE TRANSPORT : " + t.getTransport() + "\n"
                    + "Capacité : " + t.getCapacity() + "\n";
            List<Trajet> lt = t.getTrajets();
            Iterator<Trajet> itl = lt.iterator();
            s += "\tLISTE DES TRAJETS : \n";
            while (itl.hasNext()) {
                Trajet tr = itl.next();
                s += "\tDate de départ : " + tr.getDateDep() + "\n"
                        + "\tDate d'arrivée : " + tr.getDateArr() + "\n"
                        + "\tHeure départ : " + tr.getHeureDep() + "\n"
                        + "\tHeure arrivée : " + tr.getHeureArr() + "\n"
                        + "\tVille de départ : " + tr.getDepart() + "\n"
                        + "\tVille d'arrivée : " + tr.getArrive() + "\n"
                        + "\tNombre de voyageurs : " + tr.getVoyageurs().size()
                        + "\n";
            }
            s += "\n\n";
        }
        return s;
    }

    /**
     * Méthode permettant à l'administrateur d'ajouter une nouvelle instance
     * d'un moyen de transport existant.
     * 
     * @param transport
     *            : Identifie le type de transport.
     */
    public void addTransport(Transport transport) {
        List<Transport> listT = s.getTransports();
        Iterator<Transport> it = listT.iterator();

        while (it.hasNext()) {
            Transport tmp = it.next();
            if (tmp.equals(transport)) {
                return;
            }
        }
        listT.add(transport);
    }

    /**
     * Méthode permettant à l'administrateur de supprimer une instance d'un
     * moyen de transport préexistant dans les données du serveur.
     * 
     * @param transport
     *            : Identifie le type de transport.
     */
    public void deleteTransport(Transport transport) {

        List<Transport> listT = s.getTransports();
        Iterator<Transport> it = listT.iterator();

        while (it.hasNext()) {
            Transport t = it.next();
            if (t.equals(transport)) {
                listT.remove(t);
                return;
            }
        }
    }

    /**
     * Méthode permettant à l'administrateur d'ajouter un trajet à un transport
     * donné.
     * 
     * @param t
     *            : Transport dans lequel on ajoute le trajet.
     * @param tr
     *            : Le trajet que l'on ajoute.
     */
    public void addTrajet(Transport t, Trajet tr) {
        t.addTrajet(tr);
    }

    /**
     * Méthode permettant à l'administrateur de supprimer un trajet d'un
     * transport donné.
     * 
     * @param t
     *            : Transport dans lequel on supprime le trajet.
     * @param tr
     *            : Le trajet que l'on supprime.
     */
    public void removeTrajet(Transport t, Trajet tr) {
        t.removeTrajet(tr);
    }

    // Méthodes Modify \\

    /**
     * Méthode permettant à l'administrateur de modifier la capacité d'un
     * trasport.
     * 
     * @param transport
     *            : Le transport à modifier.
     * @param newCapacite
     *            : La nouvelle capacité du transport.
     */
    public void modifyTransportCapacity(Transport transport, Integer newCapacite) {
        transport.setCapacity(newCapacite);
    }

    /**
     * Méthode permettant à l'administrateur de modifier la date de départ d'un
     * trajet.
     * 
     * @param trajet
     *            : Le trajet à modifier.
     * @param newDateDep
     *            : La nouvelle date de départ du trajet.
     */
    public void modifyTrajetDateDep(Trajet trajet, String newDateDep) {
        trajet.setDateDep(newDateDep);
    }

    /**
     * Méthode permettant à l'administrateur de modifier la date d'arrivée d'un
     * trajet.
     * 
     * @param trajet
     *            : Le trajet à modifier.
     * @param newDateArr
     *            : La nouvelle date d'arrivée du trajet.
     */
    public void modifyTrajetDateArr(Trajet trajet, String newDateArr) {
        trajet.setDateArr(newDateArr);
    }

    /**
     * Méthode permettant à l'administrateur de modifier l'heure de départ d'un
     * trajet.
     * 
     * @param trajet
     *            : Le trajet à modifier.
     * @param newHeureDep
     *            : La nouvelle heure de départ du trajet.
     */
    public void modifyTrajetHeureDep(Trajet trajet, String newHeureDep) {
        trajet.setHeureDep(newHeureDep);
    }

    /**
     * Méthode permettant à l'administrateur de modifier la heure d'arrivée d'un
     * trajet.
     * 
     * @param trajet
     *            : Le trajet à modifier.
     * @param newHeureArr
     *            : La nouvelle heure d'arrivée du trajet.
     */
    public void modifyTrajetHeureArr(Trajet trajet, String newHeureArr) {
        trajet.setHeureArr(newHeureArr);
    }

    /**
     * Méthode permettant à l'administrateur de modifier la ville de départ d'un
     * trajet.
     * 
     * @param trajet
     *            : Le trajet à modifier.
     * @param newVilleDep
     *            : La nouvelle ville de départ du trajet.
     */
    public void modifyTrajetVilleDep(Trajet trajet, String newVilleDep) {
        trajet.setDepart(newVilleDep);
    }

    /**
     * Méthode permettant à l'administrateur de modifier la ville d'arrivée d'un
     * trajet.
     * 
     * @param trajet
     *            : Le trajet à modifier.
     * @param newVilleArr
     *            : La nouvelle ville d'arrivée du trajet.
     */
    public void modifyTrajetVilleArr(Trajet trajet, String newVilleArr) {
        trajet.setArrive(newVilleArr);
    }
}
